package com.avengers.common.wx;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;

/**
 * @author zhangnan
 * @since 2021/7/7 2:18 下午
 **/
public class BinaryUtil {
    private static final Logger log = LoggerFactory.getLogger(BinaryUtil.class);

    /**
     * 求list数值之和(list="1,2,4,8,16,32....")
     * (使用场景是前端将list传入进来.后端计算list之和,然后将结果直接入库)
     *
     * @param list
     * @return
     */
    public static Integer sum(List<Integer> list) {
        if (list.isEmpty()) {
            return 0;
        }
        return list.stream().reduce(Integer::sum).orElse(0);
    }

    /**
     * 二进制转换为十进制
     * (在这种方式下,该方法无用)
     *
     * @param binaryString
     * @return
     */
    public static Integer binaryToInteger(String binaryString) {
        return Integer.parseInt(binaryString, 2);
    }

    /**
     * 以base为底数.value为值,算对数.例如
     * 计算64以4为底的对数：
     * double res = log(64, 4);//4*4*4=64
     * Assert.isTrue(res==3)
     *
     * @param value
     * @param base
     * @return
     */
    public static double log(double value, double base) {
        return Math.log(value) / Math.log(base);
    }

    /**
     * 十进制数值 转对应的list
     * (使用场景是将DB中对应的int转对应的list,然后将结果返回给前端)
     *
     * @param data
     * @return
     */
    public static List<Integer> toList(Integer data) {
        List<Integer> list = new ArrayList<>();
        if (data <= 0) {
            return list;
        }
        double count = log((double) data, 2d);
        for (int i = 0; i < count + 1; i++) {
            int n = 1 << i;
            if ((data & n) == n) {
                list.add(n);
            }
        }
        return list;
    }
}